package pickbook.controller;

import java.util.HashMap;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import pickbook.model.BuyBookService;
import pickbook.model.BuyBookVO;
import pickbook.model.ListVO;
import pickbook.model.MemberVO;


//희망도서 관련 컨트롤러 정의
@Controller
public class BuyBookController {

	@Resource(name = "buyBookServiceImpl")
	private BuyBookService buyBookService;

	/**
	 * method : getSearchListByFactor
	 * comment : 검색어(factor)에 해당하는 책 정보를 찾는 메서드
	 * 
	 * @param factor
	 * @param pageNo
	 * @return
	 * 
	 * @author 이형철
	 * @date 2014-07-04
	 */
	@RequestMapping("searchbuylistbyfactor.do")
	public ModelAndView getSearchListByFactor(String factor, String pageNo) {
		
		ModelAndView mv = new ModelAndView();
		
		ListVO lvo = buyBookService.getSearchListByFactor(factor, pageNo);//희망도서 검색어 검색결과 목록
		
		if(lvo.getList().size()==0){//검색결과가 없을 경우
			mv = new ModelAndView("book.searchbuybookbyfactor/list", "noData", false);	
		}else{//검색결과가 있을 경우
			mv.addObject("searchbuybookbyfactorlvo", lvo);
			mv.setViewName("book.searchbuybookbyfactor/list");
			mv.addObject("factor", factor);//페이징을 위해 검색어 재반환
		}
		
		return mv;
	}

	/**
	 * method : getSearchListByLocationUniv
	 * comment : 위치(location)과 대학교(univ)에 해당하는 책 정보를 찾는 메서드
	 * 
	 * @param location
	 * @param univ
	 * @param pageNo
	 * @return
	 * 
	 * @author 이형철
	 * @date 2014-07-04
	 */
	@RequestMapping("searchbuylistbylocationuniv.do")
	public ModelAndView getSearchListByLocationUniv(String location, String univ, String pageNo){

		ModelAndView mv = new ModelAndView();
		
		ListVO lvo = buyBookService.getSearchListByLocationUniv(location, univ, pageNo);//희망도서 지역대학 검색결과 목록
		
		if(lvo.getList().size()==0){//검색결과가 없을 경우
			mv = new ModelAndView("book.searchbuybookbylocationuniv/list", "noData", false);	
		}else{//검색결과가 있을 경우
			mv.addObject("searchbuybookbylocationunivlvo", lvo);
			mv.setViewName("book.searchbuybookbylocationuniv/list");
			mv.addObject("location", location);//페이징을 위한 검색 지역 재반환
			mv.addObject("univ", univ);//페이징을 위한 검색 대학명 재반환
		}
		
		return mv;
		
	}

	/**
	 * method : moveRegister
	 * comment : 희망도서 목록에서 추가페이지 이동 메서드
	 * 
	 * @return
	 * 
	 * @author 제형규, 김병각
	 * @date 2014-07-03 
	 */
	@RequestMapping("auth_moveBuyRegister.do")
	public String moveRegister(){
		
		return "book.buybook/register";
		
	}
	
	/**
	 * method : bookAPIProxy
	 * comment : 도서 검색 api 프록시 역할 및 검색결과를 JSON으로 반환하도록 하는 메서드
	 * 
	 * @param request
	 * @param response
	 * @param query
	 * @return
	 * 
	 * @author 김병각
	 * @date 2014-07-07
	 */
	@RequestMapping("book_api_proxy.do")
	@ResponseBody
	public String bookAPIProxy(HttpServletRequest request, HttpServletResponse response, String query){
		
		//검색 api의 URL 주소
		String url="http://apis.daum.net/search/book?"
						+"apikey=8ecf312714fd89908551827e0d65344a5dd26062"
						+"&output=json"
						+"&searchType=isbn"+
						"&q="+query;
				
		HttpClient client = new HttpClient();//HttpClient 생성
		GetMethod method = new GetMethod(url);//GetMethod 생성
		
		String result="";
		
		try {
			int statusCode = client.executeMethod(method);
			response.reset();
			response.setStatus(statusCode);
			if (statusCode == HttpStatus.SC_OK) {
				result = method.getResponseBodyAsString();//응답 객체를 문자열로 반환
				response.setContentType("application/json; charset=utf-8");//Json Type 으로 셋팅
			}
		}catch(Exception e){
			e.printStackTrace();
		} finally {
			if (method != null){
				method.releaseConnection();
			}
		}
		return result;
		
	}
	
	/**
	 * method : insertBook
	 * comment : 희망도서 추가 메서드
	 * 
	 * @param session
	 * @param bbvo
	 * @return
	 * 
	 * @author 제형규, 김병각
	 * @date 2014-07-03
	 */
	@RequestMapping("book_buybook_register.do")
	public ModelAndView insertBook(BuyBookVO bbvo, HttpSession session) {
		
		MemberVO mvo = (MemberVO) session.getAttribute("mvo");
		bbvo.setMvo(mvo);
		bbvo.setbVisible(1);//등록한 희망도서가 Default값으로 노출되도록 설정
		
		if(bbvo.getImage().equals("0")){//이미지가 존재하지 않을 경우 Default 이미지 설정
			bbvo.setImage("http://localhost:8888/pickbook-v0.1/img/nocover.png");
		}
		buyBookService.insertBook(bbvo);//희망도서 등록
		
		return new ModelAndView("redirect:book_buybook_list.do");
		
	}
	
	/**
	 * method : buyUpdate
	 * comment : 나의 희망도서 수정 페이지로 이동하는 메서드
	 * 
	 * @param no
	 * @return
	 * 
	 * @author 제형규, 김병각
	 * @date 2014-07-03 
	 */
	@RequestMapping("auth_moveBuyUpdate.do")
	public ModelAndView buyUpdate(int no){
		
		BuyBookVO bbvo=buyBookService.findByBookNo(no);//수정할 희망도서 정보 반환
		
		return new ModelAndView("book.buybook/update","bbvo",bbvo);
		
	}
	/**
	 * method : updateBook
	 * comment : 나의 희망도서 수정하는 메서드
	 * 
	 * @param no
	 * @param bbvo
	 * @return
	 * 
	 * @author 제형규, 김병각
	 * @date 2014-07-03 
	 */
	@RequestMapping("auth_book_buybook_update.do")
	public String updateBook(BuyBookVO bbvo, int no) {
		
		bbvo.setNo(no);
		buyBookService.updateBook(bbvo);//희망도서 수정
		
		return "book.buybook/updateOK";
	}
	
	/**
	 * method : deleteBook
	 * comment : 나의 희망도서 삭제하는 메서드
	 * 
	 * @param no
	 * @return
	 * 
	 * @author 제형규, 김병각
	 * @date 2014-07-03 
	 */
	@RequestMapping("auth_deleteBuyBook.do")
	public String deleteBook(int no) {
		
		buyBookService.deleteBook(no);//희망도서 삭제
		
		return "redirect:auth_book_mybuybook_list.do";
	}	
	
	/**
	 * method : getRecentBookList
	 * comment : 최신희망도서 리스트를 전달하는 메서드
	 * 
	 * @param pageNo
	 * @return
	 * 
	 * @author 제형규, 이형철
	 * @date 2014-07-02
	 */
	@RequestMapping("book_buybook_list.do")
	public ModelAndView getRecentBookList(String pageNo){
		
		ModelAndView mv = new ModelAndView();
		
		ListVO lvo = buyBookService.getRecentBookList(pageNo);
		
		if(lvo.getList().size()==0){//최근 희망도서 목록이 존재하지 않을 경우
			mv=new ModelAndView("book.buybook/list","noData",false);
		}else{//존재할 경우
			mv.addObject("buybooklvo", lvo);
			mv.setViewName("book.buybook/list");
		}
		
		return mv;
		
	}
	
	/**
	 * method : getMyBuyBookList
	 * comment : 나의 최신희망도서 리스트를 전달하는 메서드
	 * 
	 * @param session
	 * @param pageNo
	 * @return
	 * 
	 * @author 이형철
	 * @date 2014-07-03
	 */
	@RequestMapping("auth_book_mybuybook_list.do")
	public ModelAndView getMyBuyBookList(HttpSession session, String pageNo){
		
		ModelAndView mv = new ModelAndView();
		
		MemberVO mvo = (MemberVO) session.getAttribute("mvo");
		String id = mvo.getId();
		
		ListVO lvo = buyBookService.getMyBuyBookList(pageNo, id);
		
		if(lvo.getList().size()==0){//최근 나의 희망도서 목록이 존재하지 않을 경우
			mv=new ModelAndView("book.mybuybook/list","noData",false);
		}else{//존재할 경우
			mv.addObject("mybuybooklvo", lvo);
			mv.setViewName("book.mybuybook/list");
		}
		
		return mv;
		
	}
	
	/**
	 * method : visibleBook
	 * comment : 나의 희망도서 공개 여부를 업데이트하는 메서드
	 * 
	 * @param no
	 * @param bVisible
	 * @return
	 * 
	 * @author 이형철
	 * @date 2014-07-03
	 */
	@RequestMapping("buyBookVisible.do")
	@ResponseBody
	public HashMap visibleBook(int no, int bVisible) {
		
		HashMap map=new HashMap();
		map.put("flag", buyBookService.updateVisible(no, bVisible));//HashMap 에 변경된 도서 공개여부 수정
		
		return map;
		
	}
	
}
